home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / doom / quake_ad.zip / RESPAWN.ZIP / SRC / SHAMBLER.QC < prev    next >
Text File  |  1997-03-16  |  16KB  |  416 lines

  1. /*
  2. ==============================================================================
  3.  
  4. SHAMBLER
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. $cd id1/models/shams
  10. $origin 0 0 24
  11. $base base        
  12. $skin base
  13.  
  14. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
  15. $frame stand10 stand11 stand12 stand13 stand14 stand15 stand16 stand17
  16.  
  17. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 
  18. $frame walk8 walk9 walk10 walk11 walk12
  19.  
  20. $frame    run1 run2 run3 run4 run5 run6
  21.  
  22. $frame smash1 smash2 smash3 smash4 smash5 smash6 smash7 
  23. $frame smash8 smash9 smash10 smash11 smash12
  24.  
  25. $frame swingr1 swingr2 swingr3 swingr4 swingr5 
  26. $frame swingr6 swingr7 swingr8 swingr9
  27.  
  28. $frame swingl1 swingl2 swingl3 swingl4 swingl5 
  29. $frame swingl6 swingl7 swingl8 swingl9
  30.  
  31. $frame magic1 magic2 magic3 magic4 magic5 
  32. $frame magic6 magic7 magic8 magic9 magic10 magic11 magic12
  33.  
  34. $frame pain1 pain2 pain3 pain4 pain5 pain6
  35.  
  36. $frame death1 death2 death3 death4 death5 death6 
  37. $frame death7 death8 death9 death10 death11
  38.  
  39. //--------------------------------------------------------- New Code --------
  40. void()  sham_death12;
  41. //---------------------------------------------------------------------------
  42.  
  43. void() sham_stand1    =[    $stand1,    sham_stand2    ] {ai_stand();};
  44. void() sham_stand2    =[    $stand2,    sham_stand3    ] {ai_stand();};
  45. void() sham_stand3    =[    $stand3,    sham_stand4    ] {ai_stand();};
  46. void() sham_stand4    =[    $stand4,    sham_stand5    ] {ai_stand();};
  47. void() sham_stand5    =[    $stand5,    sham_stand6    ] {ai_stand();};
  48. void() sham_stand6    =[    $stand6,    sham_stand7    ] {ai_stand();};
  49. void() sham_stand7    =[    $stand7,    sham_stand8    ] {ai_stand();};
  50. void() sham_stand8    =[    $stand8,    sham_stand9    ] {ai_stand();};
  51. void() sham_stand9    =[    $stand9,    sham_stand10] {ai_stand();};
  52. void() sham_stand10    =[    $stand10,    sham_stand11] {ai_stand();};
  53. void() sham_stand11    =[    $stand11,    sham_stand12] {ai_stand();};
  54. void() sham_stand12    =[    $stand12,    sham_stand13] {ai_stand();};
  55. void() sham_stand13    =[    $stand13,    sham_stand14] {ai_stand();};
  56. void() sham_stand14    =[    $stand14,    sham_stand15] {ai_stand();};
  57. void() sham_stand15    =[    $stand15,    sham_stand16] {ai_stand();};
  58. void() sham_stand16    =[    $stand16,    sham_stand17] {ai_stand();};
  59. void() sham_stand17    =[    $stand17,    sham_stand1    ] {ai_stand();};
  60.  
  61. void() sham_walk1        =[      $walk1,        sham_walk2 ] {ai_walk(10);};
  62. void() sham_walk2       =[      $walk2,        sham_walk3 ] {ai_walk(9);};
  63. void() sham_walk3       =[      $walk3,        sham_walk4 ] {ai_walk(9);};
  64. void() sham_walk4       =[      $walk4,        sham_walk5 ] {ai_walk(5);};
  65. void() sham_walk5       =[      $walk5,        sham_walk6 ] {ai_walk(6);};
  66. void() sham_walk6       =[      $walk6,        sham_walk7 ] {ai_walk(12);};
  67. void() sham_walk7       =[      $walk7,        sham_walk8 ] {ai_walk(8);};
  68. void() sham_walk8       =[      $walk8,        sham_walk9 ] {ai_walk(3);};
  69. void() sham_walk9       =[      $walk9,        sham_walk10] {ai_walk(13);};
  70. void() sham_walk10      =[      $walk10,       sham_walk11] {ai_walk(9);};
  71. void() sham_walk11      =[      $walk11,       sham_walk12] {ai_walk(7);};
  72. void() sham_walk12      =[      $walk12,       sham_walk1 ] {ai_walk(7);
  73. if (random() > 0.8)
  74.     sound (self, CHAN_VOICE, "shambler/sidle.wav", 1, ATTN_IDLE);};
  75.  
  76. void() sham_run1       =[      $run1,        sham_run2      ] {ai_run(20);};
  77. void() sham_run2       =[      $run2,        sham_run3      ] {ai_run(24);};
  78. void() sham_run3       =[      $run3,        sham_run4      ] {ai_run(20);};
  79. void() sham_run4       =[      $run4,        sham_run5      ] {ai_run(20);};
  80. void() sham_run5       =[      $run5,        sham_run6      ] {ai_run(24);};
  81. void() sham_run6       =[      $run6,        sham_run1      ] {ai_run(20);
  82. if (random() > 0.8)
  83.     sound (self, CHAN_VOICE, "shambler/sidle.wav", 1, ATTN_IDLE);
  84. };
  85.  
  86. void() sham_smash1     =[      $smash1,       sham_smash2    ] {
  87. sound (self, CHAN_VOICE, "shambler/melee1.wav", 1, ATTN_NORM);
  88. ai_charge(2);};
  89. void() sham_smash2     =[      $smash2,       sham_smash3    ] {ai_charge(6);};
  90. void() sham_smash3     =[      $smash3,       sham_smash4    ] {ai_charge(6);};
  91. void() sham_smash4     =[      $smash4,       sham_smash5    ] {ai_charge(5);};
  92. void() sham_smash5     =[      $smash5,       sham_smash6    ] {ai_charge(4);};
  93. void() sham_smash6     =[      $smash6,       sham_smash7    ] {ai_charge(1);};
  94. void() sham_smash7     =[      $smash7,       sham_smash8    ] {ai_charge(0);};
  95. void() sham_smash8     =[      $smash8,       sham_smash9    ] {ai_charge(0);};
  96. void() sham_smash9     =[      $smash9,       sham_smash10   ] {ai_charge(0);};
  97. void() sham_smash10    =[      $smash10,      sham_smash11   ] {
  98. local vector    delta;
  99. local float     ldmg;
  100.  
  101.     if (!self.enemy)
  102.         return;
  103.     ai_charge(0);
  104.  
  105.     delta = self.enemy.origin - self.origin;
  106.  
  107.     if (vlen(delta) > 100)
  108.         return;
  109.     if (!CanDamage (self.enemy, self))
  110.         return;
  111.         
  112.     ldmg = (random() + random() + random()) * 40;
  113.     T_Damage (self.enemy, self, self, ldmg);
  114.     sound (self, CHAN_VOICE, "shambler/smack.wav", 1, ATTN_NORM);
  115.  
  116.     SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right);
  117.     SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right);
  118. };
  119. void() sham_smash11    =[      $smash11,      sham_smash12   ] {ai_charge(5);};
  120. void() sham_smash12    =[      $smash12,      sham_run1       ] {ai_charge(4);};
  121.  
  122. void() sham_swingr1;
  123.  
  124. void(float side) ShamClaw =
  125. {
  126. local vector    delta;
  127. local float     ldmg;
  128.  
  129.     if (!self.enemy)
  130.         return;
  131.     ai_charge(10);
  132.  
  133.     delta = self.enemy.origin - self.origin;
  134.  
  135.     if (vlen(delta) > 100)
  136.         return;
  137.         
  138.     ldmg = (random() + random() + random()) * 20;
  139.     T_Damage (self.enemy, self, self, ldmg);
  140.     sound (self, CHAN_VOICE, "shambler/smack.wav", 1, ATTN_NORM);
  141.  
  142.     if (side)
  143.     {
  144.         makevectors (self.angles);
  145.         SpawnMeatSpray (self.origin + v_forward*16, side * v_right);
  146.     }
  147. };
  148.  
  149. void() sham_swingl1    =[      $swingl1,      sham_swingl2   ] {
  150. sound (self, CHAN_VOICE, "shambler/melee2.wav", 1, ATTN_NORM);
  151. ai_charge(5);};
  152. void() sham_swingl2 =[      $swingl2,      sham_swingl3   ] {ai_charge(3);};
  153. void() sham_swingl3 =[      $swingl3,      sham_swingl4   ] {ai_charge(7);};
  154. void() sham_swingl4 =[      $swingl4,      sham_swingl5   ] {ai_charge(3);};
  155. void() sham_swingl5 =[      $swingl5,      sham_swingl6   ] {ai_charge(7);};
  156. void() sham_swingl6 =[      $swingl6,      sham_swingl7   ] {ai_charge(9);};
  157. void() sham_swingl7 =[      $swingl7,      sham_swingl8   ] {ai_charge(5); ShamClaw(250);};
  158. void() sham_swingl8 =[      $swingl8,      sham_swingl9   ] {ai_charge(4);};
  159. void() sham_swingl9 =[      $swingl9,      sham_run1  ] {
  160. ai_charge(8);
  161. if (random()<0.5)
  162.     self.think = sham_swingr1;
  163. };
  164.  
  165. void() sham_swingr1    =[      $swingr1,      sham_swingr2   ] {
  166. sound (self, CHAN_VOICE, "shambler/melee1.wav", 1, ATTN_NORM);
  167. ai_charge(1);};
  168. void() sham_swingr2    =[      $swingr2,      sham_swingr3   ] {ai_charge(8);};
  169. void() sham_swingr3 =[      $swingr3,      sham_swingr4   ] {ai_charge(14);};
  170. void() sham_swingr4 =[      $swingr4,      sham_swingr5   ] {ai_charge(7);};
  171. void() sham_swingr5 =[      $swingr5,      sham_swingr6   ] {ai_charge(3);};
  172. void() sham_swingr6 =[      $swingr6,      sham_swingr7   ] {ai_charge(6);};
  173. void() sham_swingr7 =[      $swingr7,      sham_swingr8   ] {ai_charge(6); ShamClaw(-250);};
  174. void() sham_swingr8 =[      $swingr8,      sham_swingr9   ] {ai_charge(3);};
  175. void() sham_swingr9 =[      $swingr9,      sham_run1  ] {ai_charge(1);
  176. ai_charge(10);
  177. if (random()<0.5)
  178.     self.think = sham_swingl1;
  179. };
  180.  
  181. void() sham_melee =
  182. {
  183.     local float chance;
  184.     
  185.     chance = random();
  186.     if (chance > 0.6 || self.health == 600)
  187.         sham_smash1 ();
  188.     else if (chance > 0.3)
  189.         sham_swingr1 ();
  190.     else
  191.         sham_swingl1 ();
  192. };
  193.  
  194.  
  195. //============================================================================
  196.  
  197. void() CastLightning =
  198. {
  199.     local    vector    org, dir;
  200.     
  201.     self.effects = self.effects | EF_MUZZLEFLASH;
  202.  
  203.     ai_face ();
  204.  
  205.     org = self.origin + '0 0 40';
  206.  
  207.     dir = self.enemy.origin + '0 0 16' - org;
  208.     dir = normalize (dir);
  209.  
  210.     traceline (org, self.origin + dir*600, TRUE, self);
  211.  
  212.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  213.     WriteByte (MSG_BROADCAST, TE_LIGHTNING1);
  214.     WriteEntity (MSG_BROADCAST, self);
  215.     WriteCoord (MSG_BROADCAST, org_x);
  216.     WriteCoord (MSG_BROADCAST, org_y);
  217.     WriteCoord (MSG_BROADCAST, org_z);
  218.     WriteCoord (MSG_BROADCAST, trace_endpos_x);
  219.     WriteCoord (MSG_BROADCAST, trace_endpos_y);
  220.     WriteCoord (MSG_BROADCAST, trace_endpos_z);
  221.  
  222.     LightningDamage (org, trace_endpos, self, 10);
  223. };
  224.  
  225. void() sham_magic1     =[      $magic1,       sham_magic2    ] {ai_face();
  226.     sound (self, CHAN_WEAPON, "shambler/sattck1.wav", 1, ATTN_NORM);
  227. };
  228. void() sham_magic2     =[      $magic2,       sham_magic3    ] {ai_face();};
  229. void() sham_magic3     =[      $magic3,       sham_magic4    ] {ai_face();self.nextthink = self.nextthink + 0.2;
  230. local entity o;
  231.  
  232. self.effects = self.effects | EF_MUZZLEFLASH;
  233. ai_face();
  234. self.owner = spawn();
  235. o = self.owner;
  236. setmodel (o, "progs/s_light.mdl");
  237. setorigin (o, self.origin);
  238. o.angles = self.angles;
  239. o.nextthink = time + 0.7;
  240. o.think = SUB_Remove;
  241. };
  242. void() sham_magic4     =[      $magic4,       sham_magic5    ]
  243. {
  244. self.effects = self.effects | EF_MUZZLEFLASH;
  245. self.owner.frame = 1;
  246. };
  247. void() sham_magic5     =[      $magic5,       sham_magic6    ]
  248. {
  249. self.effects = self.effects | EF_MUZZLEFLASH;
  250. self.owner.frame = 2;
  251. };
  252. void() sham_magic6     =[      $magic6,       sham_magic9    ]
  253. {
  254. remove (self.owner);
  255. CastLightning();
  256. sound (self, CHAN_WEAPON, "shambler/sboom.wav", 1, ATTN_NORM);
  257. };
  258. void() sham_magic9     =[      $magic9,       sham_magic10   ]
  259. {CastLightning();};
  260. void() sham_magic10    =[      $magic10,      sham_magic11   ]
  261. {CastLightning();};
  262. void() sham_magic11    =[      $magic11,      sham_magic12   ]
  263. {
  264. if (skill == 3)
  265.     CastLightning();
  266. };
  267. void() sham_magic12    =[      $magic12,      sham_run1       ] {};
  268.  
  269.  
  270.  
  271. void() sham_pain1       =[      $pain1, sham_pain2      ] {};
  272. void() sham_pain2       =[      $pain2, sham_pain3      ] {};
  273. void() sham_pain3       =[      $pain3, sham_pain4      ] {};
  274. void() sham_pain4       =[      $pain4, sham_pain5      ] {};
  275. void() sham_pain5       =[      $pain5, sham_pain6      ] {};
  276. void() sham_pain6       =[      $pain6, sham_run1      ] {};
  277.  
  278. void(entity attacker, float damage)    sham_pain =
  279. {
  280.     sound (self, CHAN_VOICE, "shambler/shurt2.wav", 1, ATTN_NORM);
  281.  
  282.     if (self.health <= 0)
  283.         return;        // allready dying, don't go into pain frame
  284.  
  285.     if (random()*400 > damage)
  286.         return;        // didn't flinch
  287.  
  288.     if (self.pain_finished > time)
  289.         return;
  290.     self.pain_finished = time + 2;
  291.         
  292.     sham_pain1 ();
  293. };
  294.  
  295.  
  296. //============================================================================
  297.  
  298. //--------------------------------------------------------- New Code --------
  299. //  The mighty shambler LIVES!
  300. //---------------------------------------------------------------------------
  301. void()  sham_revive1    =[      $death11,      sham_revive3  ]
  302. {       self.nextthink = self.nextthink + PM_SleepTime();
  303.         self.health = 0;
  304. };
  305. void()  sham_revive2    =[      $death11,      sham_revive3  ]
  306. {       self.nextthink = self.nextthink + 5;    };
  307. void()  sham_revive3    =[      $death10,      sham_revive4  ]
  308. {       // see if ok to stand up
  309.         self.health = 600;
  310.         sound (self, CHAN_VOICE, "shambler/sidle.wav", 1, ATTN_IDLE);
  311.         self.solid = SOLID_SLIDEBOX;
  312.         if (!walkmove (0, 0))
  313.         {       self.think = sham_revive2;
  314.                 self.solid = SOLID_NOT;
  315.                 return;
  316.         }
  317. };
  318. void()  sham_revive4    =[      $death9,       sham_revive5  ] {};
  319. void()  sham_revive5    =[      $death8,       sham_revive6  ] {};
  320. void()  sham_revive6    =[      $death7,       sham_revive7  ] {ai_painforward(12);};
  321. void()  sham_revive7    =[      $death6,       sham_revive8  ] {ai_painforward(12);};
  322. void()  sham_revive8    =[      $death5,       sham_revive9  ] {ai_painforward(8);};
  323. void()  sham_revive9    =[      $death4,       sham_revive10 ] {ai_painforward(4);};
  324. void()  sham_revive10   =[      $death3,       sham_revive11 ] {ai_painforward(2);};
  325. void()  sham_revive11   =[      $death2,       sham_revive12 ] {ai_painforward(2);};
  326. void()  sham_revive12   =[      $pain5,        sham_revive13 ]
  327. {       ai_painforward(4);
  328.         sound (self, CHAN_VOICE, "demon/dland2.wav", 1, ATTN_IDLE);
  329. };
  330. void()  sham_revive13   =[      $pain6,        sham_revive14 ] {};
  331. void()  sham_revive14   =[      $death1,       sham_revive15 ] {};
  332. void()  sham_revive15   =[      $stand1,       sham_run1 ]
  333. {       self.takedamage = DAMAGE_AIM;   };
  334. //---------------------------------------------------------------------------
  335.  
  336. void() sham_death1      =[      $death1,       sham_death2     ] {};
  337. void() sham_death2      =[      $death2,       sham_death3     ] {};
  338. void() sham_death3      =[      $death3,       sham_death4     ] {self.solid = SOLID_NOT;};
  339. void() sham_death4      =[      $death4,       sham_death5     ] {};
  340. void() sham_death5      =[      $death5,       sham_death6     ] {};
  341. void() sham_death6      =[      $death6,       sham_death7     ] {};
  342. void() sham_death7      =[      $death7,       sham_death8     ] {};
  343. void() sham_death8      =[      $death8,       sham_death9     ] {};
  344. void() sham_death9      =[      $death9,       sham_death10    ] {};
  345. void() sham_death10     =[      $death10,      sham_death11    ] {};
  346. //--------------------------------------------------------- Code Change -----
  347. void() sham_death11 =
  348. {       if (PM_Revive())  sham_revive1();
  349.         else  sham_death12();
  350. };
  351. void() sham_death12     =[      $death11,      sham_death11    ] {};
  352. //---------------------------------------------------------------------------
  353.  
  354. void() sham_die =
  355. {
  356. // check for gib
  357.     if (self.health < -60)
  358.     {
  359.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  360.         ThrowHead ("progs/h_shams.mdl", self.health);
  361.         ThrowGib ("progs/gib1.mdl", self.health);
  362.         ThrowGib ("progs/gib2.mdl", self.health);
  363.         ThrowGib ("progs/gib3.mdl", self.health);
  364.         return;
  365.     }
  366.  
  367. // regular death
  368.     sound (self, CHAN_VOICE, "shambler/sdeath.wav", 1, ATTN_NORM);
  369.     sham_death1 ();
  370. };
  371.  
  372. //============================================================================
  373.  
  374.  
  375. /*QUAKED monster_shambler (1 0 0) (-32 -32 -24) (32 32 64) Ambush
  376. */
  377. void() monster_shambler =
  378. {
  379.     if (deathmatch)
  380.     {
  381.         remove(self);
  382.         return;
  383.     }
  384.     precache_model ("progs/shambler.mdl");
  385.     precache_model ("progs/s_light.mdl");
  386.     precache_model ("progs/h_shams.mdl");
  387.     precache_model ("progs/bolt.mdl");
  388.     
  389.     precache_sound ("shambler/sattck1.wav");
  390.     precache_sound ("shambler/sboom.wav");
  391.     precache_sound ("shambler/sdeath.wav");
  392.     precache_sound ("shambler/shurt2.wav");
  393.     precache_sound ("shambler/sidle.wav");
  394.     precache_sound ("shambler/ssight.wav");
  395.     precache_sound ("shambler/melee1.wav");
  396.     precache_sound ("shambler/melee2.wav");
  397.     precache_sound ("shambler/smack.wav");
  398.  
  399.     self.solid = SOLID_SLIDEBOX;
  400.     self.movetype = MOVETYPE_STEP;
  401.     setmodel (self, "progs/shambler.mdl");
  402.  
  403.     setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX);
  404.     self.health = 600;
  405.  
  406.     self.th_stand = sham_stand1;
  407.     self.th_walk = sham_walk1;
  408.     self.th_run = sham_run1;
  409.     self.th_die = sham_die;
  410.     self.th_melee = sham_melee;
  411.     self.th_missile = sham_magic1;
  412.     self.th_pain = sham_pain;
  413.     
  414.     walkmonster_start();
  415. };
  416.